--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/backend/test_app_endpoints.py 392fe50f82fe42f99cc56abaed27816249c02fff (392fe50f) Text, 4.28 KB
Tff7b72import T7ee787os
Tff7b72import T7ee787shutil
Tff7b72import T7ee787tempfile
Tff7b72import T7ee787pytest
Tff7b72import T7ee787json
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch
Tff7b72from T7ee787aiohttp Tff7b72import Te6edf3web
Tff7b72from T7ee787meshchatxT7ee787.T7ee787meshchat Tff7b72import Te6edf3ReticulumMeshChat
Tff7b72import T7ee787RNS
Tff7b72import T7ee787asyncio
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8fftemp_dirTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3dir_path Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffmkdtempTb4b4b4(Tb4b4b4)
Tff7b72yield Te6edf3dir_path
Te6edf3shutilTff7b72.Td2a8ffrmtreeTb4b4b4(Te6edf3dir_pathTb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffmock_rns_minimalTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffRNS.ReticulumTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_rnsTb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffRNS.TransportTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffLXMF.LXMRouterTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.get_file_pathTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Ta5d6ff"Ta5d6ff/tmp/mock_pathTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3mock_rns_instance Tff7b72= Te6edf3mock_rnsTff7b72.Td2a8ffreturn_value
Te6edf3mock_rns_instanceTff7b72.Td2a8ffconfigpath Tff7b72= Ta5d6ff"Ta5d6ff/tmp/mock_configTa5d6ff"
Te6edf3mock_rns_instanceTff7b72.Td2a8ffis_connected_to_shared_instance Tff7b72= Tff7b72False
Te6edf3mock_rns_instanceTff7b72.Td2a8fftransport_enabledTff7b72.Td2a8ffreturn_value Tff7b72= Tff7b72True
Te6edf3mock_id Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3specTff7b72=Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4)
Te6edf3mock_idTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6fftest_hash_32_bytes_long_01234567Ta5d6ff"
Te6edf3mock_idTff7b72.Td2a8ffhexhash Tff7b72= Te6edf3mock_idTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Te6edf3mock_idTff7b72.Td2a8ffget_private_keyTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ffbTa5d6ff"Ta5d6fftest_private_keyTa5d6ff"
Tff7b72yield Te6edf3mock_id
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_app_info_extendedTb4b4b4(Te6edf3mock_rns_minimalTb4b4b4, Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.generate_ssl_certificateTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffpsutil.ProcessTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_processTb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffpsutil.net_io_countersTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_net_ioTb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.LXSTTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_lxstTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3mock_lxstTff7b72.Td2a8ff__version__ Tff7b72= Ta5d6ff"Ta5d6ff1.2.3Ta5d6ff"
T8b949e# Setup psutil mocks
Te6edf3mock_proc_instance Tff7b72= Te6edf3mock_processTff7b72.Td2a8ffreturn_value
Te6edf3mock_proc_instanceTff7b72.Td2a8ffmemory_infoTff7b72.Td2a8ffreturn_valueTff7b72.Td2a8ffrss Tff7b72= T79c0ff1024 Tff7b72* T79c0ff1024
Te6edf3mock_proc_instanceTff7b72.Td2a8ffmemory_infoTff7b72.Td2a8ffreturn_valueTff7b72.Td2a8ffvms Tff7b72= T79c0ff2048 Tff7b72* T79c0ff1024
Te6edf3mock_net_instance Tff7b72= Te6edf3mock_net_ioTff7b72.Td2a8ffreturn_value
Te6edf3mock_net_instanceTff7b72.Td2a8ffbytes_sent Tff7b72= T79c0ff100
Te6edf3mock_net_instanceTff7b72.Td2a8ffbytes_recv Tff7b72= T79c0ff200
Te6edf3mock_net_instanceTff7b72.Td2a8ffpackets_sent Tff7b72= T79c0ff10
Te6edf3mock_net_instanceTff7b72.Td2a8ffpackets_recv Tff7b72= T79c0ff20
Te6edf3app_instance Tff7b72= Te6edf3ReticulumMeshChatTb4b4b4(
Te6edf3identityTff7b72=Te6edf3mock_rns_minimalTb4b4b4,
Te6edf3storage_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Te6edf3reticulum_config_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Tb4b4b4)
T8b949e# Create a mock request
Te6edf3request Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
T8b949e# Get the app_info handler from the routes
T8b949e# We need to find the handler for /api/v1/app/info
Te6edf3app_info_handler Tff7b72= Tff7b72None
Tff7b72for Te6edf3route Tff7b72in Te6edf3app_instanceTff7b72.Td2a8ffget_routesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3routeTff7b72.Td2a8ffpath Tff7b72== Ta5d6ff"Ta5d6ff/api/v1/app/infoTa5d6ff" Tff7b72and Te6edf3routeTff7b72.Td2a8ffmethod Tff7b72== Ta5d6ff"Ta5d6ffGETTa5d6ff"Tb4b4b4:
Te6edf3app_info_handler Tff7b72= Te6edf3routeTff7b72.Td2a8ffhandler
Tff7b72break
Tff7b72assert Te6edf3app_info_handler Tff7b72is Tff7b72not Tff7b72None
Te6edf3response Tff7b72= Tff7b72await Te6edf3app_info_handlerTb4b4b4(Te6edf3requestTb4b4b4)
Te6edf3data Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6fflxst_versionTa5d6ff" Tff7b72in Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffapp_infoTa5d6ff"Tb4b4b4]
Tff7b72assert Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffapp_infoTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fflxst_versionTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ff1.2.3Ta5d6ff"
Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffasyncio
Tff7b72async Tff7b72def Td2a8fftest_app_shutdown_endpointTb4b4b4(Te6edf3mock_rns_minimalTb4b4b4, Te6edf3temp_dirTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.meshchat.generate_ssl_certificateTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3app_instance Tff7b72= Te6edf3ReticulumMeshChatTb4b4b4(
Te6edf3identityTff7b72=Te6edf3mock_rns_minimalTb4b4b4,
Te6edf3storage_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Te6edf3reticulum_config_dirTff7b72=Te6edf3temp_dirTb4b4b4,
Tb4b4b4)
T8b949e# Mock shutdown method to avoid actual exit
Te6edf3app_instanceTff7b72.Td2a8ffshutdown Tff7b72= Te6edf3MagicMockTb4b4b4(Te6edf3side_effectTff7b72=Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4)
T8b949e# Create a mock request
Te6edf3request Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
T8b949e# Find the shutdown handler
Te6edf3shutdown_handler Tff7b72= Tff7b72None
Tff7b72for Te6edf3route Tff7b72in Te6edf3app_instanceTff7b72.Td2a8ffget_routesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3routeTff7b72.Td2a8ffpath Tff7b72== Ta5d6ff"Ta5d6ff/api/v1/app/shutdownTa5d6ff" Tff7b72and Te6edf3routeTff7b72.Td2a8ffmethod Tff7b72== Ta5d6ff"Ta5d6ffPOSTTa5d6ff"Tb4b4b4:
Te6edf3shutdown_handler Tff7b72= Te6edf3routeTff7b72.Td2a8ffhandler
Tff7b72break
Tff7b72assert Te6edf3shutdown_handler Tff7b72is Tff7b72not Tff7b72None
T8b949e# We need to patch sys.exit to avoid stopping the test runner
Tff7b72with Tb4b4b4(
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffsys.exitTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mock_exitTb4b4b4,
Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffasyncio.sleepTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3response Tff7b72= Tff7b72await Te6edf3shutdown_handlerTb4b4b4(Te6edf3requestTb4b4b4)
Tff7b72assert Te6edf3responseTff7b72.Td2a8ffstatus Tff7b72== T79c0ff200
Te6edf3data Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3responseTff7b72.Td2a8ffbodyTb4b4b4)
Tff7b72assert Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffShutting down...Ta5d6ff"
T8b949e# The shutdown happens in a task, so we wait a bit
Tff7b72await Te6edf3asyncioTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
T8b949e# Since it's in a task, we might need to check if it was called
T8b949e# but sys.exit might not have been reached yet or was called in a different context
T8b949e# For this test, verifying the endpoint exists and returns 200 is sufficient.
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────